package cn.rslee.demo.spring.jpa.service;

import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.apache.cxf.jaxrs.ext.PATCH;
import org.springframework.data.domain.Page;

import cn.rslee.demo.spring.jpa.entity.AccessLog;

/**
 * 描述：
 * 
 * <pre>
 * HISTORY
 * ****************************************************************************
 *  ID   DATE           PERSON          REASON
 *  1    2016年2月26日      rslee         Create
 * ****************************************************************************
 * </pre>
 * 
 * 
 * JPA 支持按照实体类的属性进行动态查询，基于QBE实现
 * http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
 * 摘要如下：
 * 
 * When to use 
 * 什么时候使用
 * Querying your data store with a set of static or dynamic constraints
 * 用一组静态或者动态的查询条件查询你的数据
 * Frequent refactoring of the domain objects without worrying about breaking existing queries
 * 无阻碍重构当前的实体类，不用担心影响现有的查询
 * Works independently from the underlying data store API
 * 依赖于潜在的数据存储API
 * 
 * Limitations
 * 使用限制
 * Query predicates are combined using the AND keyword
 * 查询的条件必须都是使用AND连接
 * No support for nested/grouped property constraints like firstname = ?0 or (firstname = ?1 and lastname = ?2)
 * 不支持类似firstname = ?0 or (firstname = ?1 and lastname = ?2) 这样的查询语句
 * Only supports starts/contains/ends/regex matching for strings and exact matching for other property types
 * 仅支持开始/包含/结束/正则表达式 的字符串匹配和其他类型的精确匹配
 * 
 * @author rslee
 * @since 1.0
 */
public interface AccessLogQBEService {
	
	/**
	 * 新增
	 * @param log
	 * @return
	 * AccessLog
	 */
	@POST
	@Path("/accesslog")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog create(AccessLog log);
	
	/**
	 * 更新(全部)
	 * @param log
	 * @return
	 * AccessLog
	 */
	@PUT
	@Path("/accesslog/{id}")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog update(@PathParam("id") long id,AccessLog log);
	
	/**
	 * 更新(部分)
	 * @param log
	 * @return
	 * AccessLog
	 */
	@PATCH
	@Path("/accesslog/{id}")
	@Consumes(MediaType.APPLICATION_JSON)
	@Produces(MediaType.APPLICATION_JSON)
	public AccessLog patchUpdate(@PathParam("id") long id,AccessLog log);
	
	
	/**
	 * 读取所有
	 * @return
	 * List<AccessLog>
	 */
	@GET
    @Path("/accesslogs")
    @Produces(MediaType.APPLICATION_JSON)
    List<AccessLog> findAll();
	
	/**
	 * 分页读取,访问格式为：/accesslogs/page?page=2&size=100
	 * @return
	 * List<AccessLog>
	 */
	@GET
    @Path("/accesslogs/page")
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
	Page<AccessLog> findByPage(@FormParam("page") int page,@FormParam("size") int size);
	
	

    /**
     * 读取某个
     * @param id
     * @return
     * AccessLog
     */
    @GET
    @Path("/accesslog/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    AccessLog get(@PathParam("id") long id);
    
    /**
     * 删除
     * @param id
     * @return
     * AccessLog
     */
    @DELETE
    @Path("/accesslog/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    AccessLog delete(@PathParam("id") long id);

}
